﻿#define _CRT_SECURE_NO_WARNINGS 

#include<stdio.h>

//整数指针 - 指向整数的地址           ----- 整形指针变量存放的就是整形的地址
//字符指针 - 指向字符地址             ----- 字符指针变量存放的就是字符的地址
//浮点型的指针 - 指向的数组的地址      ----- 浮点指针变量存在的就是浮点的地址  
//数组指针 - 指向数组的地址           ----- 数组指针变量存放的应该是数组的地址   (*名字)[10]

//int main()
//{
//	//    没去名字就是变量，但去的名字就是类型的
//	int* p1[10];    //p1是数组，数组是10个元素，每个元素的类型int*,所以说指针数组
//	                //如果不加括号的话 []优先级高于*
//	int(*p2)[10];   //p2是指针 ，指针指向是数组是10元素，每个元素的类型是int,所以说数组指针 
//	return 0;
//}

//int main()
//{
//	////整数指针
//	//int a = 0;
//	//int* pa = &a;
//	////字符指针
//	//char a = 0;
//	//char* pa = &a;
//	////浮点型的指针
//	//float  a = 5.5f;
//	//float* pa = &pa;
//	//数组指针
//	int arr[10] = { 1,2,3,4,5,6,7,8,9,10};
//	//如果不加括号的话 []优先级高于*
//	int (*parr)[10] = &arr;  //取出数组的地址
//	printf("%d ",(*parr)[5]);
//	return 0;
//}

//int main()
//{
//	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
//	int* p1 = arr;         //整形指针
//	//  int*   int*
//	int* p2 = &arr[0];    //整形指针
//	//  int*   int*
//	int(*p3)[10] = &arr;    //数组指针的
//	//  int（*）[10]   int（*）[10] 
//	return 0;
//}

//⼆维数组传参的本质

//void test(int arr[3][5], int c, int r) 
//{
//	int i = 0;
//	int j = 0;
//	for (i = 0; i < c; i++)
//	{
//		for (j = 0; j < r; j++)
//		{
//			printf("%d ", arr[i][j]);
//		}
//		printf("\n");
//	}
//}
//int main()
//{
//	int arr[3][5] = { {1,2,3,4,5}, {2,3,4,5,6},{3,4,5,6,7} };
//	test(arr,3,5);
//	return 0;
//}


//void test(int (*arr)[5], int c, int r)
//{
//	int i = 0;
//	int j = 0;
//	for (i = 0; i < c; i++)
//	{
//		for (j = 0; j < r; j++)
//		{
//			//printf("%d ", arr[i][j]);
//			printf("%d ", *(*(arr + i)+j));
//		}
//		printf("\n");
//	}
//}
//int main()
//{
//	int arr[3][5] = { {1,2,3,4,5}, {2,3,4,5,6},{3,4,5,6,7} };
//	test(arr, 3, 5);
//	return 0;
//}


//函数指针
//数组名 --- 数组首元素的地址
//&数组名 --- 整个数组的地址

//函数名 ---- 函数的的地址
//&函数名 ---- 函数的地址

//数组的指针 int (*数组名)[]   
//函数的指针  void(*)()
//int Add(int x, int y)
//{
//	return x + y;
//}
//
//int main()
//{
//	//int a = 10;
//	//int* pa = &a;//整型指针
//
//	//int arr[10] = {0};
//	//int (*parr)[10] = &arr;//数组指针
//
//	//函数指针变量 是用来存放函数的地址的
//	/*printf("%p\n", &Add);
//	printf("%p\n", Add);*/
//
//	int (*pf)(int, int) = &Add;//pf就是函数指针变量
//	int ret = Add(3, 5);
//	printf("%d\n", ret);//8
//
//	int ret2 = (*pf)(4, 9);
//	printf("%d\n", ret2);//13
//
//	int(*pf2)(int, int) = Add;
//	int ret3 = (*pf2)(5, 6);
//	printf("%d\n", ret3);
//
//	int ret4 = pf2(5, 6);
//	printf("%d\n", ret4);
//
//	int (*pf3)(int, int) = Add;  //只需要给类型，无需要给参数
//	int ret5 = (*pf3)(7, 8);
//	printf("%d\n", ret5);
//
//	int (*pf4)(int, int) = &Add;
//	int ret6 = (*pf4)(9, 9);
//	printf("ret6 = %d\n", ret6);
//	return 0;
//}


//int add(int x, int y)
//{
//	return x + y;
//}
//
//typedef int(*pf_t)(int, int);
//
////  函数名和&函数名俩个都是一样的性质  加*和不加*也是一样的性质的（只是为了更好的区分，新手小白）
//int main()
//{
//	//int(*pf)(int, int) = add;
//	pf_t pf= add;
//	int ret = pf(4,5);
//	printf("%d\n", ret);
//
//	int ret1 = pf(4, 6);
//	printf("%d\n", ret1);
//    
//	int(*pf2)(int, int) = &add;
//	int ret2 = (*pf2)(3,4);
//	printf("%d\n", ret2);
//	return 0;
//}



//尝试在数组指针里面使用试试看
//typedef int(*parr_t)[10] ;
//int main() 
//{
//	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
//	int(*parr)[10] = &arr;
//	parr_t parr = &arr;
//	parr_t parr = (arr);
//	printf("%d ", (*parr)[5]);
//	return 0;
//}

//typedef类型是将某些类型较大，复杂，简单化

//int add(int x, int y)
//{
//
//	return x + y;
//}
//typedef int(*parr_t)(int, int);
//
//int main()
//{
//	//int(*parr)(int, int) = add;
//	parr_t parr = &add;
//	int ret = parr(8, 9);
//	printf("%d\n ", ret);
//		return 0;
//}